package risk.control.project.utils.vaild;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class DateTimeValidator {

    // 定义时间格式
    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN);

    /**
     * 校验时间字符串是否符合指定格式
     *
     * @param dateTimeStr 时间字符串
     * @return true-合法，false-非法
     */
    public static boolean isValidDateTime(String dateTimeStr) {
        if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
            return false;
        }

        try {
            // 尝试解析字符串
            LocalDateTime.parse(dateTimeStr, FORMATTER);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    /**
     * 更严格的校验，包括日期有效性（如2月30日等非法日期）
     *
     * @param dateTimeStr 时间字符串
     * @return true-合法，false-非法
     */
    public static boolean isStrictlyValidDateTime(String dateTimeStr) {
        if (!isValidDateTime(dateTimeStr)) {
            return false;
        }

        try {
            // 再次解析以确保严格性
            LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, FORMATTER);
            // 检查解析后的值是否与原始字符串一致，防止如"2025-02-30"这样的非法日期
            return dateTimeStr.equals(dateTime.format(FORMATTER));
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    /**
     * 检查开始时间是否不晚于结束时间
     *
     * @param startTime 开始时间字符串 (格式: yyyy-MM-dd HH:mm:ss)
     * @param endTime   结束时间字符串 (格式: yyyy-MM-dd HH:mm:ss)
     * @return true-时间范围有效(开始≤结束)，false-时间范围无效或格式错误
     */
    public static boolean isValidTimeRange(String startTime, String endTime) {
        try {
            LocalDateTime start = LocalDateTime.parse(startTime, FORMATTER);
            LocalDateTime end = LocalDateTime.parse(endTime, FORMATTER);
            return !start.isAfter(end);  // 开始时间不晚于结束时间
        } catch (DateTimeParseException e) {
            return false;  // 时间格式错误直接返回false
        }
    }
}
